<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>

</body>
<script>
	// 斐波那契数列下一项是前面两项的和
	/**
	 * 生成斐波那契数列的前n项（从第0项开始）
	 * @param {number} n - 要生成的斐波那契数列项数
	 *   - n < 0 时返回空数组
	 *   - n = 0 时返回 [0]
	 *   - n >= 1 时返回包含n项的数组（第0项到第n-1项）
	 * @returns {number[]} 斐波那契数列数组，格式为[0, 1, 1, 2, ...]
	 */
	function generateFibonacci(n) {
		// 处理负数情况
		if (n < 0) return []
		
		// 初始化数列（至少包含第0项）
		let arr = [0]
		
		// 当需要1项以上时，添加第1项
		if (n >= 1) {
			arr.push(1)
		}
		
		// 生成第2项到第n-1项
		for (let i = 2; i < n; i++) {
			arr.push(arr[i - 1] + arr[i - 2])
		}
		
		return arr
	}
	
	console.log(generateFibonacci(5));  // [0,1,1,2,3,5]
	console.log(generateFibonacci(1));  // [0,1]
	console.log(generateFibonacci(10)); // []
	
	// 获取第n项的值
	/**
	 * 计算斐波那契数列的第n项
	 * @param {number} n - 要计算的斐波那契数列项索引（非负整数）
	 * @returns {number} 斐波那契数列的第n项值
	 */
	function fibonacci(n) {
		/**
		 * 使用尾递归实现斐波那契计算
		 * @param {number} n - 当前递归剩余的迭代次数
		 * @param {number} [a=0] - 当前斐波那契序列的前一个值（F(k)）
		 * @param {number} [b=1] - 当前斐波那契序列的当前值（F(k+1)）
		 * @returns {number} 当n递减到终止条件时返回的斐波那契结果
		 */
		function tailRecursiveFib(n, a = 0, b = 1) {
			// 基础情况处理：n=0时返回a(F(0))，n=1时返回b(F(1))
			if (n === 0) return a
			if (n === 1) return b
			
			// 尾递归核心：更新参数并减少n值
			// 新参数：b成为下一轮的前项，a+b成为下一轮的当前项
			return tailRecursiveFib(n - 1, b, a + b)
		}
		
		return tailRecursiveFib(n)
	}
	
	console.log(fibonacci(0), fibonacci(1), fibonacci(2), fibonacci(3), fibonacci(4), fibonacci(5))
</script>
</html>